#include <my_header.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define MAX_LINE_LENGTH 256
#define MAX_CONFIG_ITEMS 20

// 配置项结构体
typedef struct {
    char key[50];
    char value[100];
} ConfigItem;

// 服务器配置结构体
typedef struct {
    char port[10];      // 端口号字符串
    char ip[20];        // IP地址字符串
    char work_num[10];  // 工作线程数字符串
} ServerConfig;

// 去除字符串首尾的空白字符
void trim(char *str) {
    if (str == NULL || strlen(str) == 0) return;

    int start = 0, end = strlen(str) - 1;

    // 找到第一个非空白字符
    while (isspace((unsigned char)str[start])) {
        start++;
    }

    // 找到最后一个非空白字符
    while (end >= start && isspace((unsigned char)str[end])) {
        end--;
    }

    // 移动字符到字符串开头
    int i;
    for (i = 0; i <= end - start; i++) {
        str[i] = str[start + i];
    }

    str[i] = '\0'; // 添加字符串结束符
}

// 解析配置文件
int parseConfigFile(const char *filename, ConfigItem *configs, int max_items) {
    FILE *file = fopen(filename, "r");
    if (file == NULL) {
        fprintf(stderr, "Error: Could not open config file: %s\n", filename);
        return 0;
    }

    char line[MAX_LINE_LENGTH];
    int count = 0;

    while (fgets(line, sizeof(line), file) != NULL && count < max_items) {
        // 跳过空行和注释行
        if (line[0] == '#' || line[0] == '\n') {
            continue;
        }

        // 去除行尾的换行符
        line[strcspn(line, "\n")] = '\0';

        // 使用空格或制表符分割多个配置项
        char *token = strtok(line, " \t");
        while (token != NULL && count < max_items) {
            // 查找等号分隔符
            char *delimiter = strchr(token, '=');
            if (delimiter != NULL) {
                // 分割键和值
                *delimiter = '\0';
                char *key = token;
                char *value = delimiter + 1;

                // 去除键和值前后的空格
                trim(key);
                trim(value);

                // 存储配置项
                if (strlen(key) > 0 && strlen(value) > 0) {
                    strncpy(configs[count].key, key, sizeof(configs[count].key) - 1);
                    configs[count].key[sizeof(configs[count].key) - 1] = '\0';

                    strncpy(configs[count].value, value, sizeof(configs[count].value) - 1);
                    configs[count].value[sizeof(configs[count].value) - 1] = '\0';

                    count++;
                }
            }

            // 获取下一个token
            token = strtok(NULL, " \t");
        }
    }

    fclose(file);
    return count;
}

// 从配置项数组中提取服务器配置
ServerConfig extractServerConfig(ConfigItem *configs, int count) {
    ServerConfig serverConfig;

    // 初始化默认值
    strcpy(serverConfig.port, "21");           // 默认FTP端口
    strcpy(serverConfig.ip, "127.0.0.1");      // 默认本地回环地址
    strcpy(serverConfig.work_num, "1");        // 默认工作线程数

    // 遍历配置项，提取需要的值
    for (int i = 0; i < count; i++) {
        if (strcmp(configs[i].key, "port") == 0) {
            strncpy(serverConfig.port, configs[i].value, sizeof(serverConfig.port) - 1);
            serverConfig.port[sizeof(serverConfig.port) - 1] = '\0';
        } else if (strcmp(configs[i].key, "ip") == 0) {
            strncpy(serverConfig.ip, configs[i].value, sizeof(serverConfig.ip) - 1);
            serverConfig.ip[sizeof(serverConfig.ip) - 1] = '\0';
        } else if (strcmp(configs[i].key, "work_num") == 0) {
            strncpy(serverConfig.work_num, configs[i].value, sizeof(serverConfig.work_num) - 1);
            serverConfig.work_num[sizeof(serverConfig.work_num) - 1] = '\0';
        }
    }

    return serverConfig;
}

int main(int argc, char *argv[]) {
    // 检查命令行参数
    if (argc < 2) {
        fprintf(stderr, "Usage: %s <config_file>\n", argv[0]);
        return 1;
    }

    // 创建配置项数组
    ConfigItem configs[MAX_CONFIG_ITEMS];
    int count = parseConfigFile(argv[1], configs, MAX_CONFIG_ITEMS);

    printf("FTP Server Configuration (%d items):\n", count);
    for (int i = 0; i < count; i++) {
        printf("%s = %s\n", configs[i].key, configs[i].value);
    }

    // 提取服务器配置到结构体
    ServerConfig serverConfig = extractServerConfig(configs, count);

    // 输出结构体中的配置值
    printf("\nServer Config Structure:\n");
    printf("Port: %s\n", serverConfig.port);
    printf("IP: %s\n", serverConfig.ip);
    printf("Work Number: %s\n", serverConfig.work_num);

    return 0;
}
